import axios from 'axios'
import {MessageBox, Message} from 'element-ui'
import Vue from 'vue'
import ase from './ase'
import store from '@/store'
import { getToken } from '@/utils/auth'
import Qs from 'qs'

// 定义文件url头部
// 本地mock
// const url = process.env.ENV_CONFIG === 'dev' ? '/api' : process.env.BASE_API
const url = 'http://localhost:8080'

// 创建axios实例
const service = axios.create({
  baseURL: url, // api 的 base_url
  timeout: 10000, // 请求超时时间
  // transformRequest: [
  //   function (data) {
  //     return Qs.stringify(data)
  //   }
  // ]
})
/**
  * 提示函数
  * 禁止点击蒙层、显示一秒后关闭
  */
const tip = res => {
  Vue.$vux.toast.text(res, 'middle')
}

/**
* 请求失败后的错误统一处理
* @param  status 请求失败的状态码
*/
const errorHandle = (status, other) => {
  // 处理响应数据
  // 400 : 参数格式或者字段名错误
  // 401 : token错误、过期
  // 403: 无权限
  // 500 ： 服务错误
  // 状态码判断
  switch (status) {
    case 400:
      tip('请求无效')
      break
	  case 401:
      let _this = this;
      MessageBox.confirm("登录已过去，请重新登录!", '安全提示', {
        confirmButtonText: '重新登录',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        sessionStorage.removeItem('token');
        window.location.href = '/';
      })
      break
    case 404:
      tip('请求的资源不存在')
      break
    case 403:
      tip('无访问权限，请联系管理员！')
      break
    case 500:
      tip('服务端错误，请联系管理员！')
      break
    default:
      console.log(other)
  }
}
// request拦截器
service.interceptors.request.use(
  config => {
    Vue.$vux.loading.show({ text: '加载中...' })


//	  if (!store.getters.token) {
//	      store.getters.token = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
//	  }
	   
	  config.headers['token'] = sessionStorage.getItem('token') ? sessionStorage.getItem('token') : "";
	  config.headers['Content-Type'] = "application/json;charset=utf-8";

    return config
  },
  error => {
    console.log(error) // for debug
    Promise.reject(error)
  }
)

// response 拦截器
service.interceptors.response.use(
  response => {
    /**
     * code为非200是抛错 可结合自己业务进行修改
     */
    Vue.$vux.loading.hide()
    const isEncrypt = store.state.isEncrypt
    const res = isEncrypt ? ase.decrypt(response.data) : response.data
    if (res.code == 401) {
      // 请求已发出，但是不在2xx的范围
      errorHandle(res.code, res.message)
      return Promise.reject(res.message)
    } else {
      return res
    }
    return res;
  },
  error => {
    Vue.$vux.loading.hide()
	  // 重新登录
    // 处理响应失败
    if ((!error.request || error.request.status == 0) && !error.response) {
      Message.error('网络出错，请确认网络是否正常后再次重试');
    }else if (error.response && error.response.status == 401) {
        let _this = this;
		    MessageBox.confirm(error.response.data.msg, '安全提示', {
		        confirmButtonText: '重新登录',
		        cancelButtonText: '取消',
		        type: 'warning'
		    }).then(() => {
          sessionStorage.removeItem('token');
          window.location.href = '/';
		    })
		}
    return Promise.reject(error)
  }
)

export default service
